<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Sentinel限流技术深度解析 | 技术小馆</title>
    <link rel="stylesheet" href="https://cdn.staticfile.org/font-awesome/6.4.0/css/all.min.css">
    <link rel="stylesheet" href="https://cdn.staticfile.org/tailwindcss/2.2.19/tailwind.min.css">
    <link href="https://fonts.googleapis.com/css2?family=Noto+Serif+SC:wght@400;500;600;700&family=Noto+Sans+SC:wght@300;400;500;700&display=swap" rel="stylesheet">
    <script src="https://cdn.jsdelivr.net/npm/mermaid@latest/dist/mermaid.min.js"></script>
    <style>
        body {
            font-family: 'Noto Sans SC', Tahoma, Arial, Roboto, "Droid Sans", "Helvetica Neue", "Droid Sans Fallback", "Heiti SC", "Hiragino Sans GB", Simsun, sans-serif;
            color: #333;
            line-height: 1.6;
        }
        h1, h2, h3, h4, h5, h6 {
            font-family: 'Noto Serif SC', serif;
            font-weight: 600;
        }
        .hero-image {
            background-size: cover;
            background-position: center;
            background-blend-mode: multiply;
        }
        .content-card {
            transition: transform 0.3s ease, box-shadow 0.3s ease;
        }
        .content-card:hover {
            transform: translateY(-5px);
            box-shadow: 0 10px 25px rgba(0, 0, 0, 0.1);
        }
        .drop-cap::first-letter {
            font-size: 3em;
            float: left;
            line-height: 0.8;
            margin-right: 8px;
            color: #4f46e5;
        }
        .code-block {
            font-family: 'Courier New', Courier, monospace;
            background-color: #f8f8f8;
            border-left: 4px solid #4f46e5;
        }
    </style>
</head>
<body class="bg-gray-50">
    <!-- Hero Section -->
    <div class="hero-image bg-gradient-to-r from-indigo-500 to-purple-600 text-white py-20 px-4 sm:px-6 lg:px-8">
        <div class="max-w-7xl mx-auto text-center">
            <div class="inline-block bg-indigo-600 bg-opacity-80 px-4 py-1 rounded-full mb-4">
                <span class="text-sm font-semibold">高可用架构</span>
            </div>
            <h1 class="text-4xl md:text-5xl font-bold mb-6">Sentinel限流技术深度解析</h1>
            <p class="text-xl md:text-2xl max-w-3xl mx-auto leading-relaxed">
                探索阿里巴巴开源的分布式系统流量控制解决方案，构建高可用的微服务架构
            </p>
            <div class="mt-10">
                <a href="#content-start" class="inline-flex items-center px-6 py-3 border border-transparent text-base font-medium rounded-md text-indigo-700 bg-white hover:bg-gray-100 transition-colors duration-200">
                    <i class="fas fa-book-reader mr-2"></i> 开始阅读
                </a>
            </div>
        </div>
    </div>

    <!-- Main Content -->
    <div id="content-start" class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-12">
        <!-- Introduction -->
        <div class="bg-white content-card rounded-xl shadow-md p-8 mb-12">
            <div class="drop-cap mb-6">
                随着互联网应用的不断发展和用户数量的迅猛增长，系统需要处理的请求量也随之增加。在这样的背景下，如何保证系统在高负载下仍然能够稳定、高效地运行，成为了每一个架构师和开发者必须面对的挑战。而限流技术，正是我们解决这个问题的重要手段之一。
            </div>
            
            <img src="https://cdn.nlark.com/yuque/0/2024/png/21449790/1719451098945-e769e268-84fe-4c77-8d7b-ad664ef8019d.png" alt="限流原理示意图" class="w-full rounded-lg mb-6">
            
            <p class="text-lg">
                限流的基本思想是通过限制系统的处理能力，防止过大的流量冲击系统，从而保障系统的稳定性。具体来说，限流可以帮助我们控制并发请求数量，防止系统过载，保护关键资源，提升用户体验。 Sentinel作为阿里巴巴开源的一个高可用保护组件，Sentinel提供了丰富的流控策略和灵活的配置方式，广泛应用于各种大型互联网应用中，帮助开发者实现精细化的流量管理。
            </p>
        </div>

        <!-- Why Rate Limiting -->
        <div class="bg-white content-card rounded-xl shadow-md p-8 mb-12">
            <h2 class="text-3xl font-bold mb-6 text-gray-800 border-b pb-2">限流的必要性</h2>
            <p class="text-lg mb-6">
                在现代互联网应用中，限流（Rate Limiting）是一种关键的技术手段，用于控制进入系统的请求速率，确保系统的稳定性和高可用性。限流的需求源自多方面，包括保护系统资源、防止滥用、提升用户体验等。
            </p>
            
            <img src="https://cdn.nlark.com/yuque/0/2024/png/21449790/1719451404440-01ef78fc-5b5b-4ca6-8ee6-d64d861d5971.png" alt="限流必要性示意图" class="w-full rounded-lg mb-8">
            
            <div class="grid md:grid-cols-2 gap-6">
                <!-- Card 1 -->
                <div class="bg-gray-50 p-6 rounded-lg border border-gray-200 hover:border-indigo-300 transition-colors duration-200">
                    <div class="flex items-center mb-3">
                        <div class="bg-indigo-100 p-2 rounded-full mr-4">
                            <i class="fas fa-shield-alt text-indigo-600"></i>
                        </div>
                        <h3 class="text-xl font-semibold text-gray-800">保护系统资源</h3>
                    </div>
                    <p class="text-gray-600">
                        每个系统都有其处理能力的上限，无论是计算资源、存储资源还是网络带宽。超出这一上限，系统可能会出现过载，导致响应变慢甚至崩溃。限流通过限制并发请求的数量，确保系统在其承载能力范围内运行，避免资源耗尽的情况。
                    </p>
                </div>
                
                <!-- Card 2 -->
                <div class="bg-gray-50 p-6 rounded-lg border border-gray-200 hover:border-indigo-300 transition-colors duration-200">
                    <div class="flex items-center mb-3">
                        <div class="bg-indigo-100 p-2 rounded-full mr-4">
                            <i class="fas fa-user-shield text-indigo-600"></i>
                        </div>
                        <h3 class="text-xl font-semibold text-gray-800">防止滥用和恶意攻击</h3>
                    </div>
                    <p class="text-gray-600">
                        限流也是防止滥用和抵御恶意攻击的重要手段。恶意用户可能通过频繁请求或DDoS攻击来试图瘫痪系统。限流可以限制单个用户或IP地址的请求速率，防止恶意流量对系统造成损害。
                    </p>
                </div>
                
                <!-- Card 3 -->
                <div class="bg-gray-50 p-6 rounded-lg border border-gray-200 hover:border-indigo-300 transition-colors duration-200">
                    <div class="flex items-center mb-3">
                        <div class="bg-indigo-100 p-2 rounded-full mr-4">
                            <i class="fas fa-smile text-indigo-600"></i>
                        </div>
                        <h3 class="text-xl font-semibold text-gray-800">提升用户体验</h3>
                    </div>
                    <p class="text-gray-600">
                        在高流量环境中，如果没有限流机制，系统容易陷入过载，导致所有用户的请求都无法及时得到响应。通过限流，可以优先处理重要的请求，确保关键业务的正常运行，从而提升整体用户体验。
                    </p>
                </div>
                
                <!-- Card 4 -->
                <div class="bg-gray-50 p-6 rounded-lg border border-gray-200 hover:border-indigo-300 transition-colors duration-200">
                    <div class="flex items-center mb-3">
                        <div class="bg-indigo-100 p-2 rounded-full mr-4">
                            <i class="fas fa-tachometer-alt text-indigo-600"></i>
                        </div>
                        <h3 class="text-xl font-semibold text-gray-800">保障服务质量</h3>
                    </div>
                    <p class="text-gray-600">
                        限流有助于保障服务质量（QoS）。在微服务架构中，各个服务之间可能存在相互调用。如果某个下游服务出现故障或性能瓶颈，会影响到上游服务的稳定性。通过对下游服务的请求进行限流，可以防止故障扩散。
                    </p>
                </div>
            </div>
        </div>

        <!-- Sentinel Overview -->
        <div class="bg-white content-card rounded-xl shadow-md p-8 mb-12">
            <h2 class="text-3xl font-bold mb-6 text-gray-800 border-b pb-2">Sentinel概述</h2>
            <p class="text-lg mb-6">
                Sentinel 是阿里巴巴开源的一个分布式系统的流量管理组件，主要用于保障微服务架构中的高可用性。它提供了多种功能，包括流量控制、熔断降级、系统负载保护等，通过实时监控、统计和限流控制等手段，有效提升系统的稳定性和弹性。
            </p>
            
            <img src="https://cdn.nlark.com/yuque/0/2024/png/21449790/1719451239443-e7fb1997-2954-4b47-8a70-7e1421cc5ac7.png" alt="Sentinel架构图" class="w-full rounded-lg mb-8">
            
            <div class="grid md:grid-cols-2 gap-6">
                <div>
                    <h3 class="text-2xl font-semibold mb-4 text-gray-700">核心功能</h3>
                    <ul class="space-y-3">
                        <li class="flex items-start">
                            <i class="fas fa-tint text-indigo-500 mt-1 mr-3"></i>
                            <span class="flex-1"><strong>流量控制：</strong>根据预设的限流规则，对系统的请求流量进行精准控制，防止突发流量对系统造成冲击。</span>
                        </li>
                        <li class="flex items-start">
                            <i class="fas fa-plug text-indigo-500 mt-1 mr-3"></i>
                            <span class="flex-1"><strong>熔断降级：</strong>当系统某个资源或服务的异常率、响应时间等超过设定阈值时，熔断器会打开，暂时停止对该资源的调用。</span>
                        </li>
                        <li class="flex items-start">
                            <i class="fas fa-server text-indigo-500 mt-1 mr-3"></i>
                            <span class="flex-1"><strong>系统负载保护：</strong>监控系统的整体负载情况，在系统负载过高时，自动对流量进行限制。</span>
                        </li>
                        <li class="flex items-start">
                            <i class="fas fa-chart-line text-indigo-500 mt-1 mr-3"></i>
                            <span class="flex-1"><strong>实时监控：</strong>提供了丰富的监控和统计功能，可以实时查看系统的流量、异常情况和规则触发情况。</span>
                        </li>
                        <li class="flex items-start">
                            <i class="fas fa-sliders-h text-indigo-500 mt-1 mr-3"></i>
                            <span class="flex-1"><strong>动态规则配置：</strong>支持动态调整流量控制和熔断降级规则，确保系统能够快速响应变化的流量和负载情况。</span>
                        </li>
                    </ul>
                </div>
                
                <div class="mermaid">
                    graph TD
                        A[Sentinel核心功能] --> B[流量控制]
                        A --> C[熔断降级]
                        A --> D[系统负载保护]
                        A --> E[实时监控]
                        
                        B --> F[基于QPS限流]
                        B --> G[基于并发线程数限流]
                        B --> H[热点参数限流]
                        
                        C --> I[异常比例熔断]
                        C --> J[异常数熔断]
                        C --> K[慢调用比例熔断]
                        
                        D --> L[CPU负载保护]
                        D --> M[内存保护]
                        D --> N[系统负载自适应]
                </div>
            </div>
        </div>

        <!-- Rate Limiting Strategies -->
        <div class="bg-white content-card rounded-xl shadow-md p-8 mb-12">
            <h2 class="text-3xl font-bold mb-6 text-gray-800 border-b pb-2">Sentinel的限流策略</h2>
            <p class="text-lg mb-6">
                Sentinel 的限流策略是其核心功能之一，通过对系统流量进行精确控制，可以有效避免突发流量对系统的冲击，提高系统的稳定性和可用性。限流策略在 Sentinel 中主要通过多种规则配置实现。
            </p>
            
            <img src="https://cdn.nlark.com/yuque/0/2024/png/21449790/1719451177853-4d6d8550-a79e-4929-a551-1e3d6ebee348.png" alt="限流策略示意图" class="w-full rounded-lg mb-8">
            
            <div class="grid md:grid-cols-2 gap-6">
                <!-- Strategy 1 -->
                <div class="p-6 bg-gradient-to-br from-blue-50 to-indigo-50 rounded-lg">
                    <h3 class="text-xl font-semibold mb-3 text-indigo-700">1. 直接限流策略</h3>
                    <div class="pl-4 border-l-4 border-indigo-200">
                        <h4 class="font-medium text-gray-700 mb-2">1.1 基于 QPS 的限流</h4>
                        <p class="text-gray-600 mb-3">每秒查询率（Queries Per Second）限流是最常见的限流方式。它通过限制某个资源在单位时间（通常是1秒）内的最大请求数来控制流量。</p>
                        
                        <h4 class="font-medium text-gray-700 mb-2">1.2 基于并发线程数的限流</h4>
                        <p class="text-gray-600">通过限制同时处理请求的最大线程数来控制流量。</p>
                    </div>
                </div>
                
                <!-- Strategy 2 -->
                <div class="p-6 bg-gradient-to-br from-purple-50 to-indigo-50 rounded-lg">
                    <h3 class="text-xl font-semibold mb-3 text-purple-700">2. 关联限流策略</h3>
                    <p class="text-gray-600">当某个资源的请求量超过阈值时，对其他关联资源进行限流。适用于资源之间有依赖关系的场景。</p>
                </div>
                
                <!-- Strategy 3 -->
                <div class="p-6 bg-gradient-to-br from-green-50 to-teal-50 rounded-lg">
                    <h3 class="text-xl font-semibold mb-3 text-teal-700">3. 链路限流策略</h3>
                    <p class="text-gray-600">通过对调用链路进行监控和限流，限制特定调用链路上的流量。适用于复杂调用链路的场景。</p>
                </div>
                
                <!-- Strategy 4 -->
                <div class="p-6 bg-gradient-to-br from-yellow-50 to-amber-50 rounded-lg">
                    <h3 class="text-xl font-semibold mb-3 text-amber-700">4. 热点参数限流策略</h4>
                    <p class="text-gray-600">通过监控请求中的参数，对某些热点参数进行限流。适用于参数频繁变化的场景。</p>
                </div>
                
                <!-- Strategy 5 -->
                <div class="p-6 bg-gradient-to-br from-red-50 to-pink-50 rounded-lg">
                    <h3 class="text-xl font-semibold mb-3 text-pink-700">5. 系统自适应限流策略</h3>
                    <p class="text-gray-600">根据系统的负载情况进行动态限流，保证系统在高负载下的稳定性。</p>
                </div>
                
                <!-- Strategy 6 -->
                <div class="p-6 bg-gradient-to-br from-gray-50 to-blue-gray-50 rounded-lg">
                    <h3 class="text-xl font-semibold mb-3 text-blue-gray-700">6. 队列等待限流策略</h3>
                    <p class="text-gray-600">通过将请求排队处理，控制流量的进入速度。适用于对响应时间要求不高的场景。</p>
                </div>
            </div>
        </div>

        <!-- Implementation Methods -->
        <div class="bg-white content-card rounded-xl shadow-md p-8 mb-12">
            <h2 class="text-3xl font-bold mb-6 text-gray-800 border-b pb-2">Sentinel限流的实现方式</h2>
            <p class="text-lg mb-6">
                Sentinel 提供了多种限流实现方式，灵活适应不同的开发需求和场景。以下是三种主要的限流实现方式：
            </p>
            
            <div class="grid md:grid-cols-3 gap-6">
                <!-- Method 1 -->
                <div class="border rounded-lg overflow-hidden">
                    <div class="bg-indigo-600 text-white px-4 py-3">
                        <h3 class="text-lg font-semibold flex items-center">
                            <i class="fas fa-code mr-2"></i> 基于注解的限流
                        </h3>
                    </div>
                    <div class="p-4">
                        <p class="text-gray-600 mb-4">
                            基于 Spring AOP（面向切面编程）机制，通过注解实现方法级别的限流。开发者只需在需要限流的方法上添加注解，Sentinel 会自动生成相应的限流逻辑。
                        </p>
                        <div class="code-block p-4 rounded text-sm overflow-x-auto">
                            <pre><code>@SentinelResource(value = "resourceName", 
    blockHandler = "handleBlock")
public void someMethod() {
    // 方法逻辑
}

public void handleBlock(BlockException ex) {
    // 限流处理逻辑
}</code></pre>
                        </div>
                        <div class="mt-4 bg-blue-50 p-3 rounded text-sm">
                            <i class="fas fa-check-circle text-blue-500 mr-2"></i> <strong>优点：</strong>简单易用，无需显式编写限流逻辑，适合大部分常见场景。
                        </div>
                    </div>
                </div>
                
                <!-- Method 2 -->
                <div class="border rounded-lg overflow-hidden">
                    <div class="bg-purple-600 text-white px-4 py-3">
                        <h3 class="text-lg font-semibold flex items-center">
                            <i class="fas fa-terminal mr-2"></i> 基于API的限流
                        </h3>
                    </div>
                    <div class="p-4">
                        <p class="text-gray-600 mb-4">
                            通过编程方式调用 Sentinel API，在代码中显式定义和实现限流逻辑。适用于需要更高灵活性和复杂限流策略的场景。
                        </p>
                        <div class="code-block p-4 rounded text-sm overflow-x-auto">
                            <pre><code>try (Entry entry = SphU.entry("resourceName")) {
    // 方法逻辑
} catch (BlockException ex) {
    // 限流处理逻辑
}

// 规则配置
List&lt;FlowRule&gt; rules = new ArrayList&lt;&gt;();
FlowRule rule = new FlowRule();
rule.setResource("resourceName");
rule.setGrade(RuleConstant.FLOW_GRADE_QPS);
rule.setCount(10);
rules.add(rule);
FlowRuleManager.loadRules(rules);</code></pre>
                        </div>
                        <div class="mt-4 bg-purple-50 p-3 rounded text-sm">
                            <i class="fas fa-check-circle text-purple-500 mr-2"></i> <strong>优点：</strong>灵活性高，可以根据业务需求动态调整限流策略，适合复杂场景。
                        </div>
                    </div>
                </div>
                
                <!-- Method 3 -->
                <div class="border rounded-lg overflow-hidden">
                    <div class="bg-teal-600 text-white px-4 py-3">
                        <h3 class="text-lg font-semibold flex items-center">
                            <i class="fas fa-cog mr-2"></i> 流控规则的配置
                        </h3>
                    </div>
                    <div class="p-4">
                        <p class="text-gray-600 mb-4">
                            通过配置文件或控制台定义和管理限流规则，集中管理系统的流控策略。支持多种限流规则和参数设置，适应不同的流控需求。
                        </p>
                        <div class="code-block p-4 rounded text-sm overflow-x-auto">
                            <pre><code># YAML配置示例
rules:
  - resource: "resourceName"
    grade: 1
    count: 10</code></pre>
                        </div>
                        <div class="mt-4 bg-teal-50 p-3 rounded text-sm">
                            <i class="fas fa-check-circle text-teal-500 mr-2"></i> <strong>优点：</strong>集中管理、实时生效，便于运维人员监控和调整限流策略。
                        </div>
                    </div>
                </div>
            </div>
        </div>

        <!-- Rate Limiting Algorithms -->
        <div class="bg-white content-card rounded-xl shadow-md p-8 mb-12">
            <h2 class="text-3xl font-bold mb-6 text-gray-800 border-b pb-2">Sentinel限流算法</h2>
            <p class="text-lg mb-6">
                Sentinel限流算法是其流量控制功能的核心部分，旨在通过不同的限流策略和算法来保障系统的稳定性和高可用性。
            </p>
            
            <div class="grid md:grid-cols-2 gap-6">
                <div>
                    <h3 class="text-2xl font-semibold mb-4 text-gray-700">核心限流算法</h3>
                    
                    <div class="space-y-6">
                        <!-- Algorithm 1 -->
                        <div class="p-4 bg-gray-50 rounded-lg border border-gray-200">
                            <h4 class="text-lg font-medium text-indigo-600 mb-2">1. 固定窗口算法（Fixed Window Algorithm）</h4>
                            <p class="text-gray-600 mb-2">将时间划分为固定长度的窗口，每个窗口内记录请求数。如果请求数超过了阈值，则触发限流。</p>
                            <div class="flex flex-wrap gap-2">
                                <span class="px-2 py-1 text-xs rounded bg-indigo-100 text-indigo-800">优点：实现简单</span>
                                <span class="px-2 py-1 text-xs rounded bg-red-100 text-red-800">缺点：边界突增问题</span>
                            </div>
                        </div>
                        
                        <!-- Algorithm 2 -->
                        <div class="p-4 bg-gray-50 rounded-lg border border-gray-200">
                            <h4 class="text-lg font-medium text-indigo-600 mb-2">2. 滑动窗口算法（Sliding Window Algorithm）</h4>
                            <p class="text-gray-600 mb-2">将固定窗口细分为多个小窗口，通过滑动窗口来记录和统计请求数，从而更精确地控制请求速率。</p>
                            <div class="flex flex-wrap gap-2">
                                <span class="px-2 py-1 text-xs rounded bg-indigo-100 text-indigo-800">优点：平滑控制</span>
                                <span class="px-2 py-1 text-xs rounded bg-red-100 text-red-800">缺点：实现复杂</span>
                            </div>
                        </div>
                        
                        <!-- Algorithm 3 -->
                        <div class="p-4 bg-gray-50 rounded-lg border border-gray-200">
                            <h4 class="text-lg font-medium text-indigo-600 mb-2">3. 令牌桶算法（Token Bucket Algorithm）</h4>
                            <p class="text-gray-600 mb-2">系统以恒定速率生成令牌，令牌存储在令牌桶中。当请求到达时，需要获取一个令牌才能继续处理。</p>
                            <div class="flex flex-wrap gap-2">
                                <span class="px-2 py-1 text-xs rounded bg-indigo-100 text-indigo-800">优点：处理突发流量</span>
                                <span class="px-2 py-1 text-xs rounded bg-red-100 text-red-800">缺点：可能存在延迟</span>
                            </div>
                        </div>
                        
                        <!-- Algorithm 4 -->
                        <div class="p-4 bg-gray-50 rounded-lg border border-gray-200">
                            <h4 class="text-lg font-medium text-indigo-600 mb-2">4. 漏桶算法（Leaky Bucket Algorithm）</h4>
                            <p class="text-gray-600 mb-2">系统以恒定速率处理请求，类似于水从漏桶中以固定速率流出。如果请求到达速度超过处理速率，超出的请求会被丢弃。</p>
                            <div class="flex flex-wrap gap-2">
                                <span class="px-2 py-1 text-xs rounded bg-indigo-100 text-indigo-800">优点：平滑流量</span>
                                <span class="px-2 py-1 text-xs rounded bg-red-100 text-red-800">缺点：不灵活</span>
                            </div>
                        </div>
                    </div>
                </div>
                
                <div>
                    <h3 class="text-2xl font-semibold mb-4 text-gray-700">代码配置示例</h3>
                    
                    <div class="code-block p-4 rounded text-sm overflow-x-auto mb-6">
                        <pre><code>import com.alibaba.csp.sentinel.*;
import com.alibaba.csp.sentinel.slots.block.*;
import com.alibaba.csp.sentinel.slots.block.flow.*;
import com.alibaba.csp.sentinel.slots.block.RuleConstant;

public class MyService {
    public void doSomething() {
        try (Entry entry = SphU.entry("doSomething")) {
            // 方法逻辑
        } catch (BlockException ex) {
            // 限流处理逻辑
        }
    }

    public static void initFlowRules() {
        List&lt;FlowRule&gt; rules = new ArrayList&lt;&gt;();
        FlowRule rule = new FlowRule();
        rule.setResource("doSomething");
        rule.setGrade(RuleConstant.FLOW_GRADE_QPS);
        rule.setCount(10);
        rules.add(rule);
        FlowRuleManager.loadRules(rules);
    }
}</code></pre>
                    </div>
                    
                    <div class="p-4 bg-indigo-50 rounded-lg">
                        <h4 class="text-lg font-medium text-indigo-700 mb-2">配置管理方式</h4>
                        <ul class="list-disc pl-5 text-gray-600 space-y-2">
                            <li><strong>代码配置：</strong>直接在Java代码中定义限流规则</li>
                            <li><strong>文件配置：</strong>通过YAML或JSON文件定义规则</li>
                            <li><strong>控制台配置：</strong>通过Sentinel控制台进行可视化配置</li>
                        </ul>
                    </div>
                </div>
            </div>
        </div>
    </div>

    <!-- Footer -->
    <footer class="bg-gray-900 text-gray-300 py-10">
        <div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
            <div class="flex flex-col items-center">
                <div class="text-xl font-semibold text-white mb-2">技术小馆</div>
                <a href="http://www.yuque.com/jtostring" class="text-indigo-400 hover:text-indigo-300 transition-colors duration-200">
                    <i class="fas fa-link mr-1"></i> http://www.yuque.com/jtostring
                </a>
                <div class="mt-6 flex space-x-6">
                    <a href="#" class="text-gray-400 hover:text-white">
                        <i class="fab fa-github"></i>
                    </a>
                    <a href="#" class="text-gray-400 hover:text-white">
                        <i class="fab fa-twitter"></i>
                    </a>
                    <a href="#" class="text-gray-400 hover:text-white">
                        <i class="fab fa-linkedin"></i>
                    </a>
                </div>
            </div>
        </div>
    </footer>

    <script>
        mermaid.initialize({
            startOnLoad: true,
            theme: 'default',
            flowchart: {
                useMaxWidth: true,
                htmlLabels: true,
                curve: 'basis'
            }
        });
    </script>
</body>
</html>